<?php

require_once 'BancoDeDados.php';
require_once 'Permissao.php';

class Recurso {

    private $cod_recurso;
    private $descricao;
    private $permissao;
    private $vinculado;

    public function &getCod_recurso() {
        return $this->cod_recurso;
    }

    public function setCod_recurso(&$cod_recurso) {
        $this->cod_recurso = &$cod_recurso;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getPermissoes() {
        return $this->permissao;
    }

    public function setPermissoes(&$permissao) {
        $this->permissao = &$permissao;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Recurso existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into recurso (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao') {
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Recurso existente");
            }
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update recurso set ' . $campo_id . ' = ? where cod_recurso = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_recurso));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from recurso where cod_recurso = ?');
        $result = $link->execute($stmt, array($this->cod_recurso));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from recurso order by descricao');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $recurso = new Recurso();
            $recurso->setCod_recurso($row['cod_recurso']);
            $recurso->setDescricao($row['descricao']);
            $recurso->setVinculado($recurso->verificarVinculacao());
            $resultado[] = &$recurso;
            unset($recurso);
        }
        return $resultado;
    }

    public static function consultar(&$cod_recurso) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from recurso where cod_recurso = ?', array($cod_recurso));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Recurso inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Recurso com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $recurso = new Recurso();
        $recurso->setCod_recurso($row['cod_recurso']);
        $recurso->setDescricao($row['descricao']);
        return $recurso;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_recurso from recurso where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_recurso from permissao where cod_recurso = ?', array($this->cod_recurso));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

}